package com.atom.app;

import android.content.Context;

import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;

import com.atom.annotation.api.ApiImplCallback;
import com.atom.annotation.api.ApiImplContext;
import com.atom.base.app.Hello;
import com.atom.core.ApiImplRouter;
import com.atom.module.logger.Logger;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.util.Collection;

/**
 * Instrumented test, which will execute on an Android device.
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
@RunWith(AndroidJUnit4.class)
public class Test_ApiImpl_GetImpl {

    @Before
    public void init() {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
        Logger.init(true, false, "");
    }

    // 根据指定父类或接口,找到继承或实现的子类,并创建一个对象
    @Test
    public void testApiImpl_2() {
        ApiImplRouter instance = ApiImplRouter.getInstance();
        instance.getImpl(Hello.class, new ApiImplCallback<Hello>() {
            @Override
            public void call(ApiImplContext apiImplContext, Hello hello) {
                Logger.e(hello.getClass());
                hello.hello();
            }
        });
    }

    // 根据指定父类或接口,找到继承或实现的子类,并创建一个对象 根据名称获取
    @Test
    public void testApiImpl_3() {
        ApiImplRouter instance = ApiImplRouter.getInstance();
        instance.getImpl(Hello.class, "hello3", new ApiImplCallback<Hello>() {
            @Override
            public void call(ApiImplContext apiImplContext, Hello hello) {
                Logger.e(hello.getClass());
                hello.hello();
            }
        });
    }
    // 根据指定父类或接口,找到继承或实现的子类,并创建一个对象 根据名称和版本 以版本号为主进行获取
    // 版本号 == -1 则获取版本为最大的
    // 如果版本号== -无穷 ,则获取版本最小的
    @Test
    public void testApiImpl_4() {
        ApiImplRouter instance = ApiImplRouter.getInstance();
        instance.getImpl(Hello.class, "hello2", -1, false, new ApiImplCallback<Hello>() {
            @Override
            public void call(ApiImplContext apiImplContext, Hello hello) {
                Logger.e(hello.getClass());
                hello.hello();
            }
        });
        instance.getImpl(Hello.class, "hello2", -Integer.MAX_VALUE, false, new ApiImplCallback<Hello>() {
            @Override
            public void call(ApiImplContext apiImplContext, Hello hello) {
                Logger.e(hello.getClass());
                hello.hello();
            }
        });
    }
    // 根据指定父类或接口,找到继承或实现的子类,并创建一个对象 根据名称和版本 精确获取
    @Test
    public void testApiImpl_5() {
        ApiImplRouter instance = ApiImplRouter.getInstance();
        instance.getImpl(Hello.class, "hello3", 5, false, new ApiImplCallback<Hello>() {
            @Override
            public void call(ApiImplContext apiImplContext, Hello hello) {
                Logger.e(hello.getClass());
                hello.hello();
            }
        });
    }
    // 根据指定父类或接口,找到继承或实现的子类,并创建一个对象 根据名称和版本 模糊获取
    @Test
    public void testApiImpl_6() {
        ApiImplRouter instance = ApiImplRouter.getInstance();
        instance.getImpl(Hello.class, "[A-Za-z0-9]+", 5, true, new ApiImplCallback<Hello>() {
            @Override
            public void call(ApiImplContext apiImplContext, Hello hello) {
                Logger.e(hello.getClass());
                hello.hello();
            }
        });
    }
    // 根据指定父类或接口,找到继承或实现的子类,并创建一个对象 根据名称和版本 模糊获取
    @Test
    public void testApiImpl_7() {
        ApiImplRouter instance = ApiImplRouter.getInstance();
        instance.getImpl(Hello.class, "HelloWorld7", new ApiImplCallback<Hello>() {
            @Override
            public void call(ApiImplContext apiImplContext, Hello hello) {
                Logger.e(hello.getClass());
                hello.hello();
            }
        });
    }
}